#include <bits/stdc++.h>
using namespace std;
// bool ishuiwen(string s)
// {
//     for(int i=0,j=s.size()-1;i<j;i++,j--)if(s[i]!=s[j])return false;
//     return true;
// }
// int main() 
// {
//     string s;cin>>s;
//     if(s.empty()||s.size()==1)
//     {
//         cout<<-1<<endl;
//         return 0;
//     }
//     if(ishuiwen(s))
//     {
//         cout<<s.size()<<endl;
//         return 0;
//     }
//     int minlen=s.size();
//     for(int i=0;i<s.size();i++)
//     {
//         string s1;
//         s1+=s[i];
//         for(int j=i+1;j<s.size();j++)
//         {
//             s1+=s[j];
//             if(ishuiwen(s1))minlen=min(minlen,(int)s1.size());
//         }
//     }
//     if(minlen==s.size())cout<<-1<<endl;
//     else cout<<minlen<<endl;
//     return 0;    
// }

//解法二
// int main()
// {
//     string s;cin>>s;
//     int ret=-1;
//     for(int i=0;i<s.size();i++)
//     {
//         if(i+1<s.size()&&s[i]==s[i+1])
//         {
//             ret=2;
//             break;
//         }
//         if(i+2<s.size()&&s[i]==s[i+2])
//         {
//             ret=3;
//         }
//     }
//     cout<<ret<<endl;
//     return 0;
// }


// int n;
// using ll=long long;
// int main()
// {
//     cin>>n;
//     vector<ll> ret(n+1,0);
//     // vector<vector<ll>> dp(n+1,vector<ll>(n+1,0));
//     vector<ll> dp(n+1,0);
//     for(int i=1;i<=n;i++)cin>>ret[i];
//     dp[0]=0;dp[1]=ret[1];
//     for(int i=2;i<=n;i++)
//     {
//         dp[i]=max(dp[i-2]+ret[i],dp[i-1]);
//     }
//     cout<<dp[n]<<endl;
//     return 0;
// }

//https://ac.nowcoder.com/acm/problem/229310
//解法一：扫描线
// int n,p;
// using ll=long long;
// int main()
// {
//     cin>>n>>p;
//     vector<int> ret(n+1,0);
//     vector<pair<int,int>> events;
//     for(int i=1;i<=n;i++)
//     {
//         cin>>ret[i];
//         int left=ret[i]-p;
//         int right=ret[i]+p;
//         events.emplace_back(left,1);
//         //实际区间设置为[left,right+1)，可以保证区间重叠时可以正确解决，
//         //这样就保证了是在left开始事件，right+1结束事件
//         events.emplace_back(right+1,-1);
//     }
//     sort(events.begin(),events.end());
//     int maxlen=0,count=0;

//     for(auto& even:events)
//     {
//         count+=even.second;
//         maxlen=max(maxlen,count);
//     }
//     cout<<maxlen<<endl;
//     return 0;
// }

//解法二：滑动窗口,保证区间内max-min的值在2*p范围内
// int n,p;
// using ll=long long;
// int main()
// {
//     cin>>n>>p;
//     vector<int> ret(n,0);
//     for(int i=0;i<n;i++)cin>>ret[i];
//     sort(ret.begin(),ret.end());
//     int maxlen=0,count=0;
//     for(int left=0,right=0;left<=right,right<n;)
//     {
//         if(ret[right]-ret[left]<=2*p)count++;
//         //大于直接移动left位置即可，不需要对count操作
//         else left++;
//         maxlen=max(maxlen,count);
//         right++;
//     }
//     cout<<maxlen<<endl;
//     return 0;
// }

//解法三：二分，查找区间
int n,p;
using ll=long long;
int main()
{
    cin>>n>>p;
    vector<int> ret(n,0);
    for(int i=0;i<n;i++)cin>>ret[i];
    sort(ret.begin(),ret.end());
    int maxlen=0;
    for(int i=0;i<n;i++)
    {
        //lower_bound返回的时第一个大于等于value的指针或迭代器
        int left=lower_bound(ret.begin(),ret.end(),ret[i]-p)-ret.begin();
        //返回第一个大于value的指针或迭代器，所以需要减一
        int right=upper_bound(ret.begin(),ret.end(),ret[i]+p)-ret.begin()-1;
        maxlen=max(maxlen,right-left+1);
    }
    cout<<maxlen<<endl;
    return 0;
}

// int main()
// {
//     cin>>n>>p;
//     vector<int> ret(n,0);
//     for(int i=0;i<n;i++)cin>>ret[i];
//     sort(ret.begin(),ret.end());
//     int maxlen=0;
//     for(int i=0;i<n;i++)
//     {
//         int target=ret[i]+2*p;
//         int left=0,right=n;
//         while(left<right)
//         {
//             int mid=left+(right-left)/2;
//             if(ret[mid]<=target)left=mid+1;
//             else right=mid;
//         }
//         maxlen=max(maxlen,left-i);
//     }
//     cout<<maxlen<<endl;
//     return 0;
// }

//leetcode打家劫舍
// class Solution {
//     public:
//         int rob(vector<int>& nums) {
//             if(nums.size()==1)return nums[0];
//             vector<int> dp(nums.size(),0);
//             dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);
//             for(int i=2;i<nums.size();i++)
//             {
//                 dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
//             }
//             return dp[nums.size()-1];
//         }
//     };